# encoding: utf-8
# @File  : image_to_video.py
# @Author: wu shaofan
# @Date  :  2024/04/26
# @Desc : 将自动化测试过程中生成的图片合成视频
import os
import cv2
from PIL import Image
import config
from moviepy.editor import VideoFileClip
from contextlib import redirect_stdout


def image_to_video(image_path, media_path):
    """
    图片合成视频函数
    :参数 image_path: 图片存放路径
    :参数 media_path: 合成视频保存路径
    :return:
    """
    # 获取图片路径下面的所有图片名称
    image_names = os.listdir(image_path)
    # print('图片总数：', len(image_names))
    # print('图片名称：', image_names)
    # 对提取到的图片名称进行排序
    image_names.sort(key=lambda n: int(n[:-4]))
    # print('图片排序后名称：', image_names)
    # 设置写入格式
    fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
    # 设置每秒帧数
    # 帧率（fps）是指每秒显示的帧数，帧率越高，视频就越流畅，文件也会越大
    # 由于图片数目较少，这里设置的帧数比较低（fps值越小每秒播放的图片数越少）
    fps = 2
    # 读取第一个图片获取大小尺寸，因为需要转换成视频的图片大小尺寸是一样的
    image = Image.open(image_path + "\{}".format(image_names[0]))
    # print('图片尺寸：', image.size)
    # 初始化媒体写入对象
    media_writer = cv2.VideoWriter(media_path, fourcc, fps, image.size)
    # 遍历图片，将每张图片加入视频当中
    for image_name in image_names:
        im = cv2.imread(os.path.join(image_path, image_name))
        media_writer.write(im)
        # print(image_name, '合并完成！')
    # 释放媒体写入对象
    media_writer.release()
    # print('视频写入完成！')

    # 使用一个空设备来重定向输出到 nowhere
    with open(os.devnull, 'w') as f, redirect_stdout(f):
        # 加载视频文件
        clip = VideoFileClip(media_path)
        # 写入转换后的视频文件
        clip.write_videofile(media_path, codec='libx264')


if __name__ == '__main__':
    # 图片文件夹路径
    image_path = config.BASE_DIR + r'\data\images'
    # 视频输出路径及文件名
    video_path = config.BASE_DIR + r'\data\video.mp4'
    image_to_video(image_path, video_path)
